package com.yeban.base.Test;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/10/2
 */

// 学生管理系统
public class StudentManageSystem {

    // 学生名
    public String[] studentNames = {"张三", "李四", "王五"};

    // 课程名
    public String[] courseNames = {"java", "web", "oracle"};

    // 每个学生的各科成绩
    public double[][] courseScores = {
            {85, 90, 78},
            {92, 88, 85},
            {78, 85, 90}
    };

    // 欢迎界面
    public void welcome() {
        Scanner sc = new Scanner(System.in);
        System.out.println("**********************");
        System.out.println(" 欢迎进入学生管理系统 ");
        System.out.println("**********************");
        System.out.println("提示：你可以使用help命令进行查看帮助");

        String order = "";
        boolean flag = true;
        while (flag && !order.equals("exit")) {
            System.out.print("SMS>");
            // 输入相关的指令
            order = sc.nextLine();

            // 判断命令是否正确，并执行命令
            flag = orderCorrect(order);

        }

    }

    // 判断指令是否正确，并返回对应的指令内容
    public boolean orderCorrect(String order) {

        // 切割命令
        String[] orderSpilt = order.split(" ");

        // 单独处理help和exit
        if(orderSpilt[0].equals("help")) {
            helpView();     // 帮助界面
            return true;
        } else if(orderSpilt[0].equals("exit")) {
            exitView();     // 退出界面
            return true;
        }

        // 只输入了指令
        if(orderSpilt.length == 1 && order(orderSpilt)) {
            System.out.println("缺少参数！请输入 命令 -h 查看帮助");
            return true;
        } else if(orderSpilt.length == 1 && !order(orderSpilt)) {
            System.out.println("命令错误！请输入 help 查看帮助");
            return true;
        }

        // 输入了 命令 -h 打印对应命令帮助
        if(orderSpilt[1].equals("-h")) {
            hOrder(orderSpilt);
            return true;
        }

        // 执行具体的命令逻辑
        switch (orderSpilt[0]) {
            case "AVGCOU":  // 查看某门课程的平均分
                orderAVGCOU(orderSpilt);
                return true;
            case "AVGSTU":  // 查看某个学生的平均分
                orderAVGSTU(orderSpilt);
                return true;
            case "SORT":    // 查看某门课程从低到高的的所有分数
                orderSORT(orderSpilt);
                return true;
            case "GET":     // 查询某个学生某门课程的对应分数
                orderGET(orderSpilt);
                return true;
            default:
                System.out.println("命令错误");
                return true;
        }
    }

    // help页面：命令提示
    public void helpView() {
        System.out.println("命令 [参数 [参数]]");
        System.out.println("命令有");
        System.out.println("AVGCOU　查看课程平均分");
        System.out.println("AVGSTU　查看学生平均分");
        System.out.println("SORT　　查看分数排序情况  ");
        System.out.println("GET　　 获取某个学生的某课分数");
        System.out.println("exit　　退出系统");
        System.out.println("可以使用 命令 -h 查看命令帮助。");
    }

    // 退出页面
    public void exitView() {
        System.out.println("系统退出，谢谢使用");
    }

    // 查看第一个字符串指令是否正确
    public boolean order(String[] orderSplit) {
        switch (orderSplit[0]) {
            case "AVGCOU":
                return true;
            case "AVGSTU":
                return true;
            case "SORT":
                return true;
            case "GET":
                return true;
            case "exit":
                return true;
            default:
                return false;
        }
    }

    // 查看命令使用： 命令 -h
    public boolean hOrder(String[] orderSplit) {
        switch (orderSplit[0]) {
            case "AVGCOU":
                System.out.println("AVGCOU 课程名");
                return true;
            case "AVGSTU":
                System.out.println("AVGSTU 学生名");
                return true;
            case "SORT":
                System.out.println("SORT 课程名");
                return true;
            case "GET":
                System.out.println("GET 学生名 课程名");
                return true;
            case "exit":
                System.out.println("exit");
                return true;
            default:
                System.out.println("输入-h命令错误！请重新输入命令！");
                return false;
        }
    }

    // 查看某门课程平均分: AVGCOU 课程名
    public void orderAVGCOU(String[] orderSpilt) {

        // 课程名
        String courseName = orderSpilt[1];
        int cindex = courseIndex(courseName);

        // 课程平均分
        double sum = 0;
        for (int i = 0; i < courseScores.length; i++) {
            sum += courseScores[i][cindex];
        }

        // 输出查询结果：对应课程平均分
        System.out.println("你所要查询的结果是：");
        System.out.println(sum / studentNames.length);

    }

    // 查看学生对应课程分数: AVGSTU 学生名
    public void orderAVGSTU(String[] orderSpilt) {

        // 学生名
        String studentName = orderSpilt[1];
        int sIndex = studentIndex(studentName);

        // 计算平均分
        double sum = 0;
        for (int i = 0; i < courseScores[0].length; i++) {
            sum += courseScores[sIndex][i];
        }

        // 输出查询结果：学生各科平均分
        System.out.println("你所要查询的结果是：");
        System.out.println(sum / courseNames.length);

    }

    // 查看某门课程的分数排名： SORT 课程名
    // 展示：[72,97,99]一维数组，从低到高
    public void orderSORT(String[] orderSpilt) {

        // 课程名
        String courseName = orderSpilt[1];
        int cindex = courseIndex(courseName);

        // 存遍历的数组
        double[] scores = new double[courseScores[0].length];

        // 遍历对应数组元素，取出每个学生对应的课程分数
        for (int i = 0; i < scores.length; i++) {
            scores[i] = courseScores[i][cindex];
        }

        // 对分数进行排序
        Arrays.sort(scores);

        // 输出查询结果：对应课程平均分
        System.out.println("你所要查询的结果是：");
        System.out.println(Arrays.toString(scores));

    }

    // 获取某个学生的某课成绩  GET 学生名 课程名
    public void orderGET(String[] orderSpilt) {

        // 学生名
        String studentName = orderSpilt[1];
        // 课程名
        String courseName = orderSpilt[2];

        // 学生索引
        int sIndex = studentIndex(studentName);
        // 课程索引
        int cIndex = courseIndex(courseName);

        // 找到对应学生，对应课程的分数
        double score = courseScores[sIndex][cIndex];

        // 输出查询结果：对应课程平均分
        System.out.println("你所要查询的结果是：");
        System.out.println(score);

    }

    // 取出学生的索引
    public int studentIndex(String student) {

        int index = 0;
        for (int i = 0; i < studentNames.length; i++) {
            if (student.equals(studentNames[i])) {
                index = i;
                return index;
            }
        }
        return index;
    }

    // 取出课程的索引
    public int courseIndex(String course) {

        int index = 0;
        for (int i = 0; i < courseNames.length; i++) {
            if (course.equals(courseNames[i])) {
                index = i;
                return index;
            }
        }
        return index;
    }

    public static void main(String[] args) {

        StudentManageSystem sms = new StudentManageSystem();

        sms.welcome();
    }
}
